import java.util.ArrayList;

import navalgo3.Modelo.Colisionador;
import navalgo3.Modelo.Destructor;
import navalgo3.Modelo.Disparo;
import navalgo3.Modelo.Fragmento;
import navalgo3.Modelo.Lancha;
import navalgo3.Modelo.MinaPorContacto;
import navalgo3.Modelo.Norte;
import navalgo3.Modelo.Posicion;
import navalgo3.Modelo.Sur;


import junit.framework.TestCase;


public class ColisionadorTests extends TestCase {

	public void testColisionEntreLanchaYDisparoSimple(){
		ArrayList<Posicion> posicionDeLancha = new ArrayList<Posicion>();
		posicionDeLancha.add(new Posicion(4,4));
		posicionDeLancha.add(new Posicion(4,5));
		Lancha unaLancha = new Lancha(posicionDeLancha, new Norte());
		Disparo unDisparo = new Disparo(new Posicion(4,5));
		Colisionador unColisionador = new Colisionador();
		unColisionador.colision(unaLancha, unDisparo);
		assertTrue (unaLancha.tieneDanioEn(new Posicion(4,5)));
	}
	
	public void testDisparoFallidoALancha(){
		ArrayList<Posicion> posicionDeLancha = new ArrayList<Posicion>();
		posicionDeLancha.add(new Posicion(4,4));
		posicionDeLancha.add(new Posicion(4,5));
		Lancha unaLancha = new Lancha(posicionDeLancha, new Norte());
		Disparo unDisparo = new Disparo(new Posicion(2,5));
		Colisionador unColisionador = new Colisionador();
		unColisionador.colision(unaLancha, unDisparo);
		assertFalse (unaLancha.tieneDanioEn(new Posicion(4,5)));
		assertFalse (unaLancha.tieneDanioEn(new Posicion(4,4)));
	}
	
	public void testColisionEntreMinaPorContactoYLancha(){
		ArrayList<Posicion> posicionDeLancha = new ArrayList<Posicion>();
		posicionDeLancha.add(new Posicion(4,4));
		posicionDeLancha.add(new Posicion(4,5));
		Lancha unaLancha = new Lancha(posicionDeLancha, new Norte());
		MinaPorContacto unaMina = new MinaPorContacto(new Posicion(4,4));
		Colisionador unColisionador = new Colisionador();
		unColisionador.explotarMina(unaMina);
		ArrayList <Fragmento> fragmentosCreados = unaMina.getFragmentos();
		for (Fragmento fragmentoActual : fragmentosCreados){
			if (unaLancha.tieneParteEn(fragmentoActual.getPosicion())){
				unColisionador.colision(unaLancha, fragmentoActual);
			}
		}
		assertTrue(unaLancha.tieneDanioEn(new Posicion(4,4)));
		assertFalse(unaLancha.tieneDanioEn(new Posicion(4,5)));
	}
	
	public void testColisionDeMinaNoDaniaDestructor(){
		ArrayList<Posicion> posicionDeDestructor = new ArrayList<Posicion>();
		posicionDeDestructor.add(new Posicion(4,2));
		posicionDeDestructor.add(new Posicion(4,3));
		posicionDeDestructor.add(new Posicion(4,4));
		Destructor unDestructor = new Destructor (posicionDeDestructor, new Sur());
		MinaPorContacto unaMina = new MinaPorContacto(new Posicion(4,2));
		Colisionador unColisionador = new Colisionador();
		unColisionador.explotarMina(unaMina);
		ArrayList <Fragmento> fragmentosCreados = unaMina.getFragmentos();
		for (Fragmento fragmentoActual : fragmentosCreados){
			if (unDestructor.tieneParteEn(fragmentoActual.getPosicion())){
				unColisionador.colision(unDestructor, fragmentoActual);
			}
		}
		assertFalse (unDestructor.tieneDanioEn(new Posicion(4,2)));
		assertFalse (unDestructor.tieneDanioEn(new Posicion(4,3)));
		assertFalse (unDestructor.tieneDanioEn(new Posicion(4,4)));
	}
}
